package com.current.game.first20240506;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;

/**
 * @author baopan
 * @createTime 2024/6/13 21:20
 */
public class BallFusion extends JPanel implements ActionListener {

    private Ball ball1, ball2;
    private Timer timer;

    public BallFusion() {
        ball1 = new Ball(50, 50, 20, Color.RED);
        ball2 = new Ball(250, 50, 20, Color.BLUE);

        timer = new Timer(1200, this); // 每20毫秒更新一次
        timer.start();

        setPreferredSize(new Dimension(1300, 1200));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        RenderingHints rh = new RenderingHints(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHints(rh);

        ball1.draw(g2d);
        ball2.draw(g2d);

        // 检查并处理融合逻辑（这里只是示例，你可以根据需要实现更复杂的逻辑）
        if (ball1.distanceTo(ball2) < ball1.getRadius() + ball2.getRadius()) {
            // 融合开始，改变颜色、大小等
            // 这里只是简单地改变颜色
            Color mixedColor = new Color(
                    (ball1.getColor().getRed() + ball2.getColor().getRed()) / 2,
                    (ball1.getColor().getGreen() + ball2.getColor().getGreen()) / 2,
                    (ball1.getColor().getBlue() + ball2.getColor().getBlue()) / 2
            );
            ball1.setColor(mixedColor);
            ball2.setColor(mixedColor);

            // 停止动画或进行其他处理
            timer.stop();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 假设我们想要让小球以固定的速度向彼此靠近
        // 我们可以简单地调整x坐标，使其向中间移动
        int dx = (ball1.getX() - ball2.getX()) / 2; // 计算x方向上的移动量

        // 注意：这里我们只改变x坐标作为示例，你可以根据需要添加y坐标的移动
        ball1.setX(ball1.getX() - dx); // 第一个小球向第二个小球移动
        ball2.setX(ball2.getX() + dx); // 第二个小球向第一个小球移动

        // 检查并处理融合逻辑
        if (ball1.distanceTo(ball2) < ball1.getRadius() + ball2.getRadius()) {
            // 融合开始，改变颜色、大小等
            // 这里我们简单地改变颜色，并停止动画
            Color mixedColor = new Color(
                    (ball1.getColor().getRed() + ball2.getColor().getRed()) / 2,
                    (ball1.getColor().getGreen() + ball2.getColor().getGreen()) / 2,
                    (ball1.getColor().getBlue() + ball2.getColor().getBlue()) / 2
            );
            ball1.setColor(mixedColor);
            ball2.setColor(mixedColor);

            // 停止动画
            timer.stop();
        }

        repaint(); // 触发重绘
    }

    // Ball类定义
    static class Ball {
        private int x, y, radius;
        private Color color;

        // 构造函数、getter、setter、draw方法、distanceTo方法等...

        public Ball() {
        }

        public Ball(int x, int y, int radius, Color color) {
            this.x = x;
            this.y = y;
            this.radius = radius;
            this.color = color;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }

        public int getRadius() {
            return radius;
        }

        public void setRadius(int radius) {
            this.radius = radius;
        }

        public Color getColor() {
            return color;
        }

        public void setColor(Color color) {
            this.color = color;
        }

        public void draw(Graphics2D g2d) {
            g2d.setColor(color);
            g2d.fill(new Ellipse2D.Double(x - radius, y - radius, 2 * radius, 2 * radius));
        }

        // DistanceTo method
        public double distanceTo(Ball other) {
            int dx = this.x - other.x;
            int dy = this.y - other.y;
            return Math.sqrt(dx * dx + dy * dy);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Ball Fusion");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new BallFusion());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
